package com.yupi.springbootinit.model.vo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.yupi.springbootinit.model.entity.DeviceInfo;
import com.yupi.springbootinit.model.vo.production.ProcessStepVO;
import com.yupi.springbootinit.model.vo.qa.QualityInspectionDetailVO;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 工作流待办任务视图对象
 */
@Data
public class WorkflowTaskVO implements Serializable {

    /**
     * 主键ID
     */
    private Long id;

    /**
     * 任务标题
     */
    private String taskTitle;

    /**
     * 任务描述
     */
    private String taskDescription;

    /**
     * 任务类型（如：CREATE_PROCESS_SHEET）
     */
    private String taskType;

    /**
     * 是否需要认领（前端用于判断是否显示认领按钮）
     * 注意：PUBLISH_BATCH（批次发布）类型任务不需要认领，由系统自动完成
     */
    private Boolean requireClaim;

    /**
     * 业务类型（如：SALES_ORDER / RDO_ORDER）
     */
    private String bizType;

    /**
     * 业务ID（如：订单ID）
     */
    private Long bizId;

    /**
     * 业务编号（如：订单号）
     */
    private String bizNumber;

    /**
     * 生产批次号
     */
    private String batchCode;

    /**
     * 流程卡号
     */
    private String flowNumber;
    /**
     * 生产计划号
     */
    private String productionPlanNumber;

    /**
     * 归属部门ID
     */
    private Long departmentId;

    /**
     * 归属部门名称
     */
    private String departmentName;

    /**
     * 父任务ID（用于建立任务层级关系）
     */
    private String parentTaskId;

    /**
     * 任务状态（PENDING / IN_PROGRESS / DONE）
     */
    private String taskStatus;

    /**
     * 任务状态显示名称
     */
    private String taskStatusName;

    /**
     * 优先级（NORMAL / HIGH / URGENT）
     */
    private String priority;

    /**
     * 优先级显示名称
     */
    private String priorityName;

    /**
     * 预计完成时间
     */
    private LocalDateTime expectedCompleteTime;

    /**
     * 认领人ID
     */
    private Long claimedBy;

    /**
     * 认领人姓名
     */
    private String claimedByName;

    /**
     * 认领时间
     */
    private LocalDateTime claimedTime;

    /**
     * 完成时间
     */
    private LocalDateTime completedTime;

    /**
     * 完成备注
     */
    private String completionRemark;

    /**
     * 创建人ID
     */
    private Long createdBy;

    /**
     * 创建人姓名
     */
    private String createdByName;

    /**
     * 备注
     */
    private String remark;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 是否可认领（前端显示用）
     * 仅当任务状态为PENDING、未被认领且不是PUBLISH_BATCH类型时为true
     */
    private Boolean canClaim;

    /**
     * 是否已被认领（前端显示用）
     */
    private Boolean isClaimed;

    /**
     * 是否逾期
     */
    private Boolean isOverdue;

    /**
     * 工艺单ID（PMC任务专用）
     */
    private Long processSheetId;
    
    /**
     * 工艺单号（PMC任务专用）
     */
    private String processSheetNo;

    
    /**
     * 扩展业务信息（JSON格式，存储其他业务相关信息）
     */
    private String extendedInfo;

    /**
     * 批次产品列表（清机任务、生产任务专用）
     */
    private List<BatchProductInfo> batchProducts;
    /**
     * 材料信息（清机任务、生产任务专用）
     */
    private MaterialInfo materialInfo;

    /**
     * 设备信息（清机任务、生产任务专用）
     */
    private DeviceInfo deviceInfo;

    /**
     * 是否可以处理（继续处理）
     * 规则：任务已认领 && 认领人是当前用户 && 状态未完成 && 有对应任务类型权限
     */
    private Boolean canProcess;

    /**
     * 是否可以查看附件
     * 规则：工程部（GC001）可查看销售订单附件
     */
    private Boolean canViewAttachment;

    /**
     * 是否可以查看详情
     * 规则：所有人都可以查看详情
     */
    private Boolean canViewDetail;

    /**
     * 是否可以完成任务
     * 规则：任务已认领 && 认领人是当前用户 && 状态为IN_PROGRESS
     */
    private Boolean canComplete;

    /**
     * 可执行操作列表（前端可选用）
     * 可能的值：VIEW_DETAIL, CLAIM, PROCESS, VIEW_ATTACHMENT, COMPLETE
     */
    private List<String> availableActions;

    /**
     * 不可操作原因（用于前端提示）
     * 例如："任务已被张三认领"、"您不属于该部门"
     */
    private String disabledReason;

    /**
     * 操作提示信息（前端可选展示）
     * 例如："点击继续处理跳转到工艺单创建页面"
     */
    private String actionHint;



    /**
     * 材料信息
     */
    @Data
    public static class MaterialInfo implements Serializable {
        /**
         * 材料牌号
         */
        private String materialBrand;

        /**
         * 材料规格
         */
        private String materialSpec;

        /**
         * 粉末厂家
         */
        private String powderSupplier;

        /**
         * 粉末型号（来自批次）
         */
        private String powderModel;

        /**
         * 粉末重量（来自批次）
         */
        private BigDecimal powderWeight;

        private static final long serialVersionUID = 1L;
    }

    /**
     * 设备信息
     */
    @Data
    public static class DeviceInfo implements Serializable {
        /**
         * 生产设备ID
         */
        private Integer deviceId;

        /**
         * 生产设备编码
         */
        private String deviceCode;

        /**
         * 生产设备名称
         */
        private String deviceName;

        /**
         * 清机设备ID
         */
        private Long cleaningDeviceId;

        /**
         * 清机设备名称
         */
        private String cleaningDeviceName;

        private static final long serialVersionUID = 1L;
    }
    /**
     * 批次产品信息
     */
    @Data
    public static class BatchProductInfo implements Serializable {
        /**
         * 产品料号
         */
        private String productCode;

        /**
         * 产品名称
         */
        private String productName;


        private BigDecimal productHeight;
        /**
         * 规格型号
         */
        private String specification;

        /**
         * 本批次生产数量
         */
        private Integer quantity;

        /**
         * 零件图号
         */
        private String partDrawingNo;

        /**
         * 单件重量（g）
         */
        private BigDecimal unitWeight;

    }
    /**
     * 工序列表（生产任务专用）
     */
    private List<ProcessStepVO> steps;
    private static final long serialVersionUID = 1L;
}